💡 AI 인사이트

🤖 AI가 여기에 결과를 출력합니다...

댓글 커뮤니티

쿠팡이벤트

이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.

검색

    로딩 중이에요... 🐣

    [코담] 웹개발·실전 프로젝트·AI까지, 파이썬·장고의 모든것을 담아낸 강의와 개발 노트

    11 앱 만들기 (1부) | ✅ 편저: 코담 운영자

    Django 튜토리얼 #11 - 앱 만들기 (1부)


    🔗 소스


    홈화면

    상품목록

    상품등록

    1. 강의 목표

    • 인벤토리 관리 시스템을 만들며 Django의 전반적인 흐름을 정리
    • 프로젝트 생성부터 앱 구성, 모델 정의, crispy-forms 연동까지 실습 진행

    2. 디렉토리 구조 (최종 완성 기준)

    FinalProject/
    ├── invProject/
    │   ├── invApp/
    │   │   ├── migrations/
    │   │   ├── templates/invApp/
    │   │   │   ├── home.html
    │   │   │   ├── layout.html
    │   │   │   ├── product_confirm_delete.html
    │   │   │   ├── product_form.html
    │   │   │   └── product_list.html
    │   │   ├── admin.py
    │   │   ├── apps.py
    │   │   ├── forms.py
    │   │   ├── models.py
    │   │   ├── tests.py
    │   │   ├── urls.py
    │   │   └── views.py
    │   ├── settings.py 외 config 파일들...
    ├── manage.py
    └── Pipfile / Pipfile.lock
    

    3. 프로젝트 생성 및 환경 설정

    (1) 가상환경 활성화 및 Django 설치

    pipenv shell
    pipenv install django
    

    (2) 추가 패키지 설치

    pipenv install django-crispy-forms
    pipenv install crispy-bootstrap5
    

    (3) 프로젝트 및 앱 생성

    django-admin startproject invProject
    cd invProject
    python manage.py startapp invApp
    

    (4) settings.py 설정

    • INSTALLED_APPS 항목에 다음 추가:
    INSTALLED_APPS = [
        ...
        'invApp',
        'crispy_forms',
        'crispy_bootstrap5',
    ]
    
    CRISPY_ALLOWED_TEMPLATE_PACKS = "bootstrap5"
    CRISPY_TEMPLATE_PACK = "bootstrap5"
    

    4. 모델 정의 (invApp/models.py)

    제품(Product) 정보를 담을 모델 정의. 각각의 필드에 대해 적절한 타입과 제약 조건 부여.

    from django.db import models
    
    class Product(models.Model):
        product_id = models.AutoField(primary_key=True)
        name = models.CharField(max_length=100)
        sku = models.CharField(max_length=50, unique=True)
        price = models.FloatField()
        quantity = models.IntegerField()
        supplier = models.CharField(max_length=100)
    
        def __str__(self):
            return self.name
    
    • AutoField(primary_key=True) → 자동 증가 ID
    • sku는 제품별 고유 코드 (unique=True)
    • __str__() 메서드는 admin 페이지나 리스트에서 이름 출력

    5. 마이그레이션 적용

    python manage.py makemigrations
    python manage.py migrate
    
    • 모델 정의 후 반드시 마이그레이션 생성 및 DB 반영 필요
    • /migrations/0001_initial.py에 생성된 필드 확인 가능

    6. 폼 정의 (invApp/forms.py)

    crispy-forms와 Bootstrap5 기반으로 구성된 제품 입력 폼 정의

    from django import forms
    from .models import Product
    
    class ProductForm(forms.ModelForm):
        class Meta:
            model = Product
            fields = '__all__'
            labels = {
                'product_id': '상품 ID',
                'name': '상품명',
                'sku': 'SKU',
                'price': '가격',
                'quantity': '수량',
                'supplier': '공급자',
            }
            widgets = {
                'product_id': forms.NumberInput(
                    attrs={'placeholder':'예: 1', 'class':'form-control'}),
                'name': forms.TextInput(
                    attrs={'placeholder':'예: 셔츠', 'class':'form-control'}),
                'sku': forms.TextInput(
                    attrs={'placeholder':'예: S12345', 'class':'form-control'}),
                'price': forms.NumberInput(
                    attrs={'placeholder':'예: 19.99', 'class':'form-control'}),
                'quantity': forms.NumberInput(
                    attrs={'placeholder':'예: 10', 'class':'form-control'}),
                'supplier': forms.TextInput(
                    attrs={'placeholder':'예: ABC 주식회사', 'class':'form-control'}),
            }
    
    
    • widgets를 활용해 각 필드별로 적절한 HTML input type과 placeholder 설정
    • class: form-control로 Bootstrap 스타일 적용

    7. URL 연결 (invApp/urls.py)

    제품 생성, 목록 조회, 수정, 삭제를 처리하는 URL 패턴을 구성합니다.

    from django.urls import path
    from . import views
    
    urlpatterns = [
        path('', views.home_view, name="home"),
        path('create/', views.product_create_view, name="product_create"),
        path('list/', views.product_list_view, name="product_list"),
        path('update/<int:product_id>/', views.product_update_view, name="product_update"),
        path('delete/<int:product_id>/', views.product_delete_view, name="product_delete"),
    ]
    

    8. 실습 요약

    • 모델, 폼, URL 설정까지 완료하면 이후 뷰 및 템플릿 연결만 하면 전체 제품 관리 기능(CRUD)을 구현할 수 있음

    다음 강의 예고

    • 12강에서는 views.py, urls.py, 템플릿 연결을 통해 CRUD 기능을 구성함
    TOP
    preload preload